package fr.blogger.web.bean.securite.spring;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.authentication.RememberMeAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.session.SessionInformation;
import org.springframework.security.core.session.SessionRegistry;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;

import fr.blogger.ejb.facade.UtilisateurFacade;
import fr.blogger.ejb.model.Utilisateur;
import fr.blogger.ejb.outils.UtilsAuthentication;
import fr.blogger.ejb.outils.UtilsEJB;

public class CustomAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

	private SessionRegistry sessionRegistry;
	private String servletPath;
	private String targetUrl;

	public CustomAuthenticationSuccessHandler() {
	}

	@Override
	public void onAuthenticationSuccess(HttpServletRequest pHttpServletRequest, HttpServletResponse pHttpServletResponse, Authentication pAuthentication) throws IOException, ServletException {
		Utilisateur utilisateur = ((Utilisateur) ((AbstractAuthenticationToken) pAuthentication).getPrincipal());
		UtilsAuthentication.updateUserDetails(utilisateur.getId());

		// Si l'utilisateur se connecte en tant que "remember me"
		if (pAuthentication instanceof RememberMeAuthenticationToken) {
			List<SessionInformation> listeSession = sessionRegistry.getAllSessions(utilisateur, false);
			if (!listeSession.isEmpty()) {
				for (SessionInformation session : listeSession) {
					session.expireNow();
				}
			}
			sessionRegistry.registerNewSession(pHttpServletRequest.getSession().getId(), utilisateur);
		}

		if (StringUtils.isNotBlank(utilisateur.getTokenModificationPassword())) {
			UtilsEJB.getService(UtilisateurFacade.class).reinitialiserToken(utilisateur);
		}
		UtilsEJB.getService(UtilisateurFacade.class).modifierDateDerniereConnexion(utilisateur);
		UtilsEJB.getService(UtilisateurFacade.class).modificationNombreEchecConnexion(utilisateur, 0);

		if (pHttpServletRequest.getServletPath().equals(servletPath)) {
			pHttpServletResponse.sendRedirect(pHttpServletRequest.getRequestURL().toString());
		} else {
			pHttpServletResponse.sendRedirect(pHttpServletRequest.getContextPath() + targetUrl);
		}
	}

	public SessionRegistry getSessionRegistry() {
		return this.sessionRegistry;
	}

	public void setSessionRegistry(SessionRegistry pSessionRegistry) {
		this.sessionRegistry = pSessionRegistry;
	}

	public String getServletPath() {
		return servletPath;
	}

	public void setServletPath(String servletPath) {
		this.servletPath = servletPath;
	}

	public String getTargetUrl() {
		return targetUrl;
	}

	public void setTargetUrl(String targetUrl) {
		this.targetUrl = targetUrl;
	}

}
